package zzs.generalframework.office.core.excel.cell;

import java.util.Calendar;
import java.util.Date;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @title
 * @description
 * @project zzs-office
 * @package zzs.generalframework.office.core.excel.cell
 * @author zzs
 * @date 2018年1月30日
 * @version 1.0
 */
public class CellContext
{
	private Logger logger = LoggerFactory.getLogger(CellContext.class);

	/**
	 * 创建单元格对象
	 * 
	 * @param row
	 * @param columnNum
	 * @return
	 */
	public Cell createCell(Row row, int columnNum)
	{
		logger.info("====创建Cell对象开始====");
		logger.debug("====创建Cell对象,入参:Row=[{}],int=[{}]====", row, columnNum);
		Cell cell = row.createCell(columnNum);
		logger.debug("====创建Cell对象,出参:Cell=[{}]====", cell);
		logger.info("====创建Cell对象结束====");
		return cell;
	}

	/**
	 * 设置单元格值
	 * 
	 * @param cell
	 * @param value
	 */
	public void setCellValue(Cell cell, Object value)
	{
		logger.info("====设置Cell值开始====");
		logger.debug("====设置Cell值,入参:Cell=[{}],Object=[{}]====", cell, value);
		if (value == null)
		{

		}
		else if (value instanceof String)
		{
			cell.setCellValue((String) value);
		}
		else if (value instanceof Boolean)
		{
			cell.setCellValue((Boolean) value);
		}
		else if (value instanceof Date)
		{
			cell.setCellValue((Date) value);
		}
		else if (value instanceof Calendar)
		{
			cell.setCellValue((Calendar) value);
		}
		else
		{
			cell.setCellValue((String) value);
		}
		logger.info("====设置Cell值结束====");
	}

	/**
	 * 设置单元格值
	 * 
	 * @param row
	 * @param columnNum
	 * @param value
	 * @return
	 */
	public Cell setCellValue(Row row, int columnNum, Object value)
	{
		logger.info("====设置单元格值开始====");
		logger.info("====设置单元格值,入参:Row=[{}],int=[{}],Object=[{}]====", row, columnNum, value);
		Cell cell = null;
		cell = createCell(row, columnNum);
		setCellValue(cell, value);
		logger.info("====设置单元格值,出参:Cell=[{}]====");
		logger.info("====设置单元格值结束====");
		return cell;
	}

	/**
	 * 获取指定的单元格
	 * 
	 * @param row
	 * @param columnNum
	 * @return
	 */
	public Cell getCell(Row row, int columnNum)
	{
		logger.info("====获取指定的单元格对象开始====");
		logger.info("====获取指定的单元格对象,入参:Row=[{}],int=[{}]====", row, columnNum);
		Cell cell = row.getCell(columnNum);
		logger.info("====获取指定的单元格对象,出参Cell=[{}]====");
		logger.info("====获取指定的单元格对象结束====");
		return cell;
	}

	/**
	 * 获取单元格类型
	 * 
	 * @param cell
	 * @return
	 */
	public CellType getCellType(Cell cell)
	{
		logger.info("====获取单元格类型开始====");
		logger.debug("====获取单元格类型,入参:Cell=[{}]====", cell);
		CellType cellType = cell.getCellTypeEnum();
		logger.debug("====获取单元格类型,出参:CellType=[{}]====", cellType);
		logger.info("====获取单元格类型结束====");
		return cellType;
	}

	/**
	 * 获取单元格类型
	 * 
	 * @param row
	 * @param columnNum
	 * @return
	 */
	public CellType getCellType(Row row, int columnNum)
	{
		logger.info("====获取单元格类型开始====");
		logger.debug("====获取单元格类型,入参:Row=[{}],int=[{}]====", row, columnNum);
		CellType cellType = getCellType(getCell(row, columnNum));
		logger.debug("====获取单元格类型,出参:CellType=[{}]====", cellType);
		logger.info("====获取单元格类型结束====");
		return cellType;
	}

	/**
	 * 获取单元格值
	 * 
	 * @param cell
	 * @return
	 */
	public Object getCellValue(Cell cell)
	{
		logger.info("====获取单元格值开始====");
		logger.info("====获取单元格值,入参:Cell=[{}]====", cell);
		Object returnObj = null;
		CellType cellType = getCellType(cell);
		if (CellType.BOOLEAN.equals(cellType))
		{
			returnObj = cell.getBooleanCellValue();
		}
		else if (CellType.NUMERIC.equals(cellType))
		{
			returnObj = cell.getNumericCellValue();
		}
		else
		{
			returnObj = cell.getStringCellValue();
		}
		logger.info("====获取单元格值,出参:Object=[{}]====", returnObj);
		logger.info("====获取单元格值结束====");
		return returnObj;
	}

	/**
	 * 获取单元格值
	 * 
	 * @param row
	 * @param columnNum
	 * @return
	 */
	public Object getCellValue(Row row, int columnNum)
	{
		logger.info("====获取单元格值开始====");
		logger.info("====获取单元格值,入参:Row=[{}],int=[{}]====", row, columnNum);
		Object obj = getCellValue(getCell(row, columnNum));
		logger.info("====获取单元格值,出参:Object=[{}]====", obj);
		logger.info("====获取单元格值结束====");
		return obj;
	}

}
